package com.example.springsecuritydemo.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
//@EnableGlobalMethodSecurity(securedEnabled=true, prePostEnabled = true) // 开启注解功能 @Secured、@PreAuthorize
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // 前端传过来的对象，将其密码转换一下
        auth.userDetailsService(userDetailsService).passwordEncoder(password());
    }

    @Bean
    PasswordEncoder password() {
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception{
        // 配置没有权限访问调整自定义页面
//        http.exceptionHandling().accessDeniedPage("/unauth.html");
//
//        http.logout()
//                .logoutUrl("/logout")
//                .logoutSuccessUrl("/index").permitAll();

        http.formLogin()
//                .loginPage("/test/login")                    // 自定义登录页面（访问接口的形式）
                .loginPage("/login.html")                      // 自定义登录页面（直接打开 resources/static下的login.html文件）
                .successForwardUrl("/test/success")            // 登录成功之后请求，请求方法post
                .failureForwardUrl("/test/fail")               // 登录失败（如，密码输错）之后请求，请求方法post
                .loginProcessingUrl("/user/login")             // 登录访问路径，请求方法post，进入loadUserByUsername方法
//                .defaultSuccessUrl("/test/index") // 登录成功之后请求，请求方法get; 这行存在时，不会跳到 /test/success
                .permitAll() // 前面的url都不需要认证即可访问
//
                .and().authorizeRequests()
                .antMatchers("/","/test/hello","/user/login").permitAll() // 这些路径不需要验证就可以访问
                .anyRequest().authenticated() // 任意的请求必须认证后才可以访问
                // 当前登录用户，只有具有 admins权限 才可以访问 /test/index 路径
//                .antMatchers("/test/index").hasAuthority("admins")
                // 当前登录用户，只有具有 admins或manager权限 时才可以访问 /test/index 路径
//                .antMatchers("/test/index").hasAnyAuthority("admins,manager,role")
//
                .and().csrf().disable(); // 关闭csrf防护
    }
}
